一款遊戲,如果少了點特效,那肯定是會覺得少了點啥,所以今天打算來製作 Particle System,讓我們能有一些火焰之類的效果可以使用。
當然我會用 ECS 的架構去且我的 Particle System。而且我希望我的 Particle System 可以透過微調參數就能達到各種效果。
雖說今天開始做,但實際上我已經先偷跑了一會兒,所以先給大家看看最終會長得如何吧。
那就讓我們開始吧
如果我們角色要移動或攻擊的時候有動畫,一般我們會去變換角色的 sprite 來達到動畫的效果,那我們通常會把要用到的所有 sprite 放到同一張裡面,稱作 sprite sheet,像這樣。
那如果今天想要用火焰的效果怎麼辦?
如果你的遊戲效果多的話,你的繪師可能會畫到死。而且如果今天要做的是3D遊戲呢?
Particle System 就是用來模擬各種不同的效果。有了 Particle System,我們不再需要畫各種時態的效果,我們只需要最基本粒子的Texture就可以了。整個系統會幫我們渲染例子,模擬效果及物理並釋放粒子。
emitter 是用來激活 Particle 以及定義 Particle 行為的地方,主要負責的有
emitter 會存有 particle pool,也就是所有的 particle。而 emitter 所有的數據都會賦予給這些 particle 讓他們模擬我們要的行為。更改 emitter 的數據就能改變 particle 的行為。
先在我們要說效果的基本單位,也就是 particle。particle僅僅是一個在螢幕上移動的 texture而已。
而 particle 的 texture 通常都會用黑白的圖片,像這樣。
particle 的屬性其實沒有硬性規定,你想要設定甚麼屬性就設計甚麼屬性。
以下是 Unity 的屬性。
他們的屬性真的很多,但我們沒有要做成這樣,有他的十分之一就好XD。
好那就來說說我們要做的目標
auto emit = registry.create();
registry.emplace<TransformComponent>(emit, glm::vec2(sf::Mouse::getPosition(window_).x, sf::Mouse::getPosition(window_).y), glm::vec2(100.f, 100.f));
registry.emplace<ParticleSystem>(emit, ResourceManager::getTexture("texture"), data);
剩下的明天繼續吧~